package logging

import (
	"fmt"
	"io"
	"log"
	"os"
	"path/filepath"
	"runtime"
)

var (
	Info    *log.Logger
	Warning *log.Logger
	Error   *log.Logger
)

func Init() error {
	// 获取可执行文件的路径
	execPath, err := os.Executable()
	if err != nil {
		return fmt.Errorf("获取可执行文件路径失败: %v", err)
	}

	// 获取可执行文件所在的目录
	execDir := filepath.Dir(execPath)

	// 设置日志文件路径（在可执行文件相邻目录）
	logDir := filepath.Join(execDir, "logs")

	// 创建日志目录（如果不存在）
	if err := os.MkdirAll(logDir, 0755); err != nil {
		return fmt.Errorf("创建日志目录失败: %v", err)
	}

	// 日志文件路径
	logFile := filepath.Join(logDir, "app.log")

	log.Printf("可执行文件路径: %s", execPath)
	log.Printf("日志目录: %s", logDir)
	log.Printf("日志文件: %s", logFile)

	// 打开日志文件（追加模式）
	file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
	if err != nil {
		return fmt.Errorf("打开日志文件失败: %v", err)
	}

	// 创建多写入器（同时写入文件和控制台）
	multiWriter := io.MultiWriter(os.Stdout, file)

	// 初始化不同级别的日志记录器
	Info = log.New(multiWriter, "INFO: ", log.Ldate|log.Ltime|log.Lshortfile)
	Warning = log.New(multiWriter, "WARNING: ", log.Ldate|log.Ltime|log.Lshortfile)
	Error = log.New(multiWriter, "ERROR: ", log.Ldate|log.Ltime|log.Lshortfile)

	Info.Printf("日志系统初始化完成")
	return nil
}

// GetCallerInfo 获取调用者信息的函数
func GetCallerInfo() string {
	_, file, line, ok := runtime.Caller(1)
	if !ok {
		return ""
	}
	return fmt.Sprintf("%s:%d", filepath.Base(file), line)
}
